package com.xjrh.traintravel.collector.netty.coder.command;

import java.io.Serializable;

/**
 * 通讯协议-帧结构
 *  <p>
 *      与通讯协议的帧格式对应。描述通讯内容的格式
 *  </p>
 * @author snps
 * @create 2022-01-17 14:17
 * @describe
 **/
public class AgreementStructure implements Serializable {

    /**
     * Part-1
     * 前导码(Preamble code)
     *      4字节。值固定为：FEFEFEFE
     */
    private String pc;

    /**
     * Part-2
     * 帧头(SD)
     *      1字节。值固定为：FB
     */
    private String sd;

    /**
     * Part-3
     * 控制(FC)
     *      1字节。解释：发送-bit7=1, 应答-bit7=0
     */
    private String fc;

    /**
     * Part-4
     * MAC地址(addr)
     *      6字节。解释：用于做连接终端的身份标识（服务器端值为0）
     */
    private String addr;

    /**
     * Part-5
     * 序号(seq)
     *      1字节。解释：递增。发送者发送，应答者保持不变
     */
    private String seq;

    /**
     * Part-6
     * 数据长度(len)
     *      2字节。解释：仅为数据长度，不包含数据之外的任何字节
     */
    private String len;

    /**
     * Part-7
     * 数据(data)
     *      N字节。解释：传输的数据（细分为N条指令，具体见”指令“）
     */
    private String data;

    /**
     * Part-8
     * 校验(fcs)
     *      2字节。解释：做指令验证
     *      从控制字段开始，到校验前一字节；
     *      采用unsigned short累加和计算；
     *      高字节在前，低字节在后
     */
    private String fcs;

    /**
     * Part-9
     * 帧尾(fs)
     *      1字节。值固定为：16
     */
    private String fs;


    /**************************************
     * Getter and Setter
     */
    public String getPc() {
        return pc;
    }

    public void setPc(String pc) {
        this.pc = pc;
    }

    public String getSd() {
        return sd;
    }

    public void setSd(String sd) {
        this.sd = sd;
    }

    public String getFc() {
        return fc;
    }

    public void setFc(String fc) {
        this.fc = fc;
    }

    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }

    public String getSeq() {
        return seq;
    }

    public void setSeq(String seq) {
        this.seq = seq;
    }

    public String getLen() {
        return len;
    }

    public void setLen(String len) {
        this.len = len;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    public String getFcs() {
        return fcs;
    }

    public void setFcs(String fcs) {
        this.fcs = fcs;
    }

    public String getFs() {
        return fs;
    }

    public void setFs(String fs) {
        this.fs = fs;
    }

    /***********************************
     * Constructor
     */
    public AgreementStructure() {
    }

    public AgreementStructure(String fc, String addr, String seq) {
        this.pc = AgreementConstant.PC_VALUE;
        this.sd = AgreementConstant.SD_VALUE;
        this.fc = fc;
        this.addr = addr;
        this.seq = seq;
        this.fs = AgreementConstant.FS_VALUE;
    }

    @Override
    public String toString() {
        return new StringBuilder(this.getPc())
                .append(this.getSd())
                .append(this.getFc())
                .append(this.getAddr())
                .append(this.getSeq())
                .append(this.getLen())
                .append(this.getData())
                .append(this.getFcs())
                .append(this.getFs())
                .toString();

    }


}